RFM 模型与使用 RFE 模型分析用户价值

1. RFM 背景

RFM 是分析用户价值的一种营销分析方法,其目的是为了找到最佳用户的方式,利用帕累托效应衡量当前用户价值和和客户潜在价值。分析的方法正如其名:

  • Recency 最近消费时间间隔,指距离最近一次消费的时间长度,在评分上可以采取 rank 为 10 的方式,其中 1 为最低[^1]
  • Frequency 指定时间段内的消费次数,针对的是在给定是时间跨度范围内(例如 12 个月),用户消费的消费次数。在分析中同样可以采取 rank 为 10 的方式评分[^1]
  • Monetary 消费总额或者平均消费额

2. RFM 变体

用户的第三个 M 属性是非常重要的价值属性,但在应用场景下或者其他特殊的目的下,需要扩展用户其他属性信息用于评估用户价值或者使用其他信息用于解决特殊问题。因此 RFM 产生了其他的不同变体模型:

  • RFD – Recency, Frequency, Duration RFM分析的修改版本,可用于分析以观众/读者/冲浪为导向的商业产品的消费者行为
  • RFE – Recency, Frequency, Engagement RFD分析的广义版本,其中可以将参与度定义为包括访问持续时间,每次访问的页面数或其他此类指标
  • RFM-I – Recency, Frequency, Monetary Value – Interactions RFM框架的一个修改版本,以说明与客户的营销互动的新近度和频率(例如,广告参与度影响因素控制)
  • RFMTC – Recency, Frequency, Monetary Value, Time, Churn rate 增强RFM模型,该模型利用概率论中的伯努利序列,并创建公式来计算客户在下一次促销或营销活动中购买的概率。该模型已由Alexandros Ioannidis实施,用于诸如输血和CDNOW数据集的数据集。

3. RFE 模型应用

本次分析以用户参与度的角度进行分析,因为数据源包括的是用户播放记录信息——用户的直播播放记录和用户点播播放记录。分析的目的是了解用户付费转化的可能性,而付费的关注依据是用户点播,用户的活跃指标是包括了直播和点播信息。

3.1 R 属性

Recency 属性计算,可以通过计算用户最近消费日期到当前日期的间隔天数计算:

RFM模型应用.ipynb >folded
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import datetime

from pyspark.sql import SparkSession
from pyspark.sql import types
from pyspark.sql import functions as F
from pyspark.sql import Window
# Pyspark 计算通过 UDF 计算
@F.udf(returnType=types.IntegerType())
def recency(date):
"""计算 RFM 中 R 属性

计算 RFM 中 R 属性,返回的是距离当前日期的时间上的天数
"""
if isinstance(date, datetime.date):
return (datetime.date.today() - date).days
elif isinstance(date, datetime.datetime):
return (datetime.datetime.now() - date).days
else:
return None

# 计算用户 recency
data.groupby("itv_account").agg(F.max(F.col("adjust_start_date")).alias("date")) \
.withColumn("recency", recency("date")).head(3)

3.2 F 属性计算

Frequency 计算的是在一定周期内活跃度频率,只需要对一定周期内特定类型的数据。因此计算过程针对选定的类型,统计数量即可统计出结果

RFM模型应用.ipynb
80
81
82
from pyspark.sql import functions as F
data.groupby("itv_account") \
.agg(F.count(F.col("adjust_start_date")).alias("frequency")).head(3)

3.3 E 属性计算

Engagement 计算用于参与度,本次的分析直接使用使用点播播放时间占总播放时间的比率。处理数据的思路: 通过窗口函数提取出总播放时间和点播播放时间之后,再进行比例求解。

RFM模型应用.ipynb >folded
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from pyspark.sql import SparkSession
from pyspark.sql import types
from pyspark.sql import functions as F
from pyspark.sql import Window

# 方法一:先通过窗口函数计算出到组内每行为止的播放时长以及分别通过播放类型判断是否需要将数据转换为 0 值以计算点播播放时长
window = Window.partitionBy("itv_account") \
.orderBy(F.col("watched_type").desc()) \
.rowsBetween(Window.unboundedPreceding, Window.currentRow)

data.select("itv_account", "watched_type", "total",
F.sum("total").over(window).alias("allEngage"),
F.when(F.col("watched_type") != "点播", 0).otherwise(F.col("total")).alias("engage")) \
.groupby("itv_account") \
.agg((F.sum("engage") / F.max("allEngage")).alias("ratio")).head(3)

# 方法二: 先转换需要的数据,再通过 groupby 聚合计算
data.select("itv_account", "total",
F.when(F.col("watched_type") != "点播", 0).otherwise(F.col("total")).alias("vod")) \
.groupby("itv_account") \
.agg((F.sum("vod")/F.sum("total")).alias("ratio")).head(3)

3.4 模型应用

不论是 RFM 还是其变体在用户价值的应用上,都是需要将是根据相应的属性得分组合进行判别用户类型,并且将相应的类型应用到特定的场景和目的下。一种是将每个属性拆分为三级之后,三个属性可以得到 27 种类型的组合,以不同的组合得到的用户类型;另外是将三种属性进行权重调整(权重方案可能根据具体的目的进行调整),筛选出特定的用户[^2]。

参考



[^1]: RFM (market research)
Wiki 中提到的评分方法是使用 Rank 等级为 10,个人建议还是使用奇数 Rank——有助于进行拆分
[^2]: 用户画像无头绪?手把手教你RFM模型

作者

ZenRay

发布于

2020-12-31

更新于

2021-04-19

许可协议

CC BY-NC-SA 4.0